package com.hyz.yuaiagent.demo.invoke;// 建议dashscope SDK的版本 >= 2.12.0


import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.JsonUtils;
import com.hyz.yuaiagent.constants.TestAPIKey;

import java.util.Arrays;

/**
 * 阿里云 零积 Ai SDK 调用
 * <p>
 * 提供调用阿里云通义千问大模型的SDK封装实现，包含消息构建、参数配置和API调用等功能
 */
public class SdkAiInvoke {

    /**
     * 调用通义千问大模型生成对话响应
     * <p>
     * 方法流程：
     * 1. 初始化Generation实例
     * 2. 构建系统角色和用户角色的消息对象
     * 3. 配置模型参数并执行API调用
     *
     * @return GenerationResult 包含完整的模型响应结果，含响应消息和元数据
     * @throws ApiException           API调用异常（HTTP错误码4xx/5xx）
     * @throws NoApiKeyException      未配置API Key异常
     * @throws InputRequiredException 必需参数缺失异常
     */
    public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();

        /* 构建系统角色提示词，定义助手基础行为准则 */
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("You are a helpful assistant.")
                .build();

        /* 构建用户提问内容，此处使用固定测试问题"你是谁？" */
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content("你是谁？")
                .build();

        /* 模型调用参数配置，包含：
         * - API身份认证密钥
         * 指定模型版本(qwen-plus)
         * 组合系统消息和用户消息
         * 设置响应格式为结构化消息 */
        GenerationParam param = GenerationParam.builder()
                .apiKey(TestAPIKey.ApiKey)
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        return gen.call(param);
    }


    /**
     * 主执行方法，演示完整调用流程
     * <p>
     * 执行步骤：
     * 1. 调用模型获取响应结果
     * 2. 将结果转换为JSON格式输出
     * 3. 异常处理及错误日志输出
     *
     * @param args 命令行参数（本实现未使用）
     */
    public static void main(String[] args) {
        try {
            GenerationResult result = callWithMessage();
            System.out.println(JsonUtils.toJson(result));
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            // 使用日志框架记录异常信息
            System.err.println("An error occurred while calling the generation service: " + e.getMessage());
        }
        System.exit(0);
    }
}
